package Chapter4;

//87页程序4.2
public class Date{
    private int day, month, year;    //私有的成员变量，Date类外不可访问，其他类内的方法可访问。
    Date( ){                      //默认的构造方法，给定初值。
        day=1;
        month=1;
        year=1998;
    }
    Date( int i, int j, int k ){        //重载的构造方法，并将参数赋给成员变量，此时i，j，k
        day=i;
        month=j;
        year=k;
    }
    Date( Date d ){             //拷贝默认的构造方法，参数就是Date类的类对象d。
        day=d.day;            //通过对象d访问Date类的成员变量，为自己创建成员变量。
        month=d.month;
        year=d.year;
    }                         //以上三个都为构造方法。
    public String printDate( ){   //公有方法，功能是返回一组日期数据，类型为String。
        return (day+"/"+month+"/"+year);
    }
    public Date tomorrow( ){    //公有方法，也是Date类的成员方法，功能是返回下一天的日期数据。
        Date d=new Date(this);   //this是以当前对象创建一个局部的临时对象d，与上面的类对象d不同。
        d.day++;                //把临时对象d的日期+1。
        if(d.day>d.daysInMonth( )){  //如果临时对象d的日期大于当前月的日期，调用了下面的方法。
            d.day=1;              //将day置为1。
            d.month++;            //将临时对象d的月份+1。
            if(d.month>12){        //如果临时对象d的月份超过12个月。
                d.month=1;        //将month置为1。
                d.year++;         //把临时对象d的年份+1。
            }
        }
        return d;                  //返回临时对象d变更后的日期值。
    }
    public int daysInMonth( ){   //公有方法，方法功能为当前月的日期值设置，不同的月day值不同。
        if(month<=0 || month>12)
            return -1;             //如果月份不合法则直接返回值-1，表示出错。
        switch(month){
            case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                return 31;        //表示当前月为大月时，day为31。
            case 4: case 6: case 9: case 11:
                return 30;  //表示当前月为小月时，day为30。
            default:
                if ((year % 4 == 0 && year % 100 != 0)||year % 400 == 0) return 29;
                else return 28;
//&是逻辑与，表示左右两边同时为真或假 |是逻辑或，表示A或B有一个成立  &&、||具有短路效果，即左边为假、左边为真则右边不执行
//如果是2月份还要判断是闰年还是平年。tips：闰年可以
// 被4整除，且不能被100整除。如果世纪元年xx00可被100整除则是平年。或被400
// 整除等于0为闰年。闰年返回29天，剩下的情况则是平年2月，返回28天。
        }
    }                      //以上三个都为公共方法，表示可通过实例进行访问。

    public static void main (String[] args){    //主方法，程序执行入口。
        Date d1 = new Date( );    //创建类的实例d1，调用默认构造方法。
        Date d2 = new Date(28,2,1964);  //创建类的实例d2，调用第二个构造方法，i，j，k分别为28，2，1964。
        Date d3 = new Date(d2);   //创建类的实例d3，调用第二个构造方法，值相同但内存不同。
        System.out.println("date d1 is (dd/mm/yy):"+d1.printDate( ));
        System.out.println("date d3 is (dd/mm/yy):"+d3.printDate( ));
        System.out.println("Its tomorrow is (dd/mm/yy):"+d3.tomorrow( ).printDate( ));
    }
}
//输出1——为date d1 is (dd/mm/yy):1/1/1998；
//输出2——为date d3 is (dd/mm/yy):28/2/1964；
//输出3——为Its tomorrow is (dd/mm/yy):29/2/1964。